package cc.bookcloud.tool.ocr.common.parsetext;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import cc.bookcloud.tool.ocr.util.ocr.OcrTextParseUtil;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @Desc: 发票特征工厂
 * @Version: 2.0
 * @Author: John Goo
 * @Date: 2024/12/02 14:17
 **/
@Data
public class InvoiceFeatureFactory {



    private List<InvoiceFeatureAbstract> featureList = new ArrayList<>();

    // 识别类型 false
    protected Boolean isIdentifyType = false;

    public InvoiceFeatureFactory(){
        init();
    }

    private void init() {
        // 火车票
        featureList.add(new InvoiceFeatureTrainTicket("train_ticket", "火车票"));

        // 全电电子发票(普通发票)")
        featureList.add(new InvoiceFeatureNormalElectronic("vat_electronic_invoice_new", "全电电子发票(普通发票)"));

        // .............
    }




    /**
     * @Desc：发票类型分析
    * @Author：John Goo
    * @Date：2024/12/2 15:39
    * @param text
    * @param pos
    * @return null-本行未找到;非空-找到发票类型
    */
    private String findCharacter(String text,int pos,JSONArray array){
        for(InvoiceFeatureAbstract feature : featureList){
            // 计算分数 100分机制
            feature.score(pos,text,array);
            // selected选中
            if(feature.totalScore >= 100){
                this.isIdentifyType = true;
                // 找到特征
                return feature.getType();
            }
        }
       return null;
    }

    /**
     * @param jsonStr
     * @return JSONObject
     * @Desc：检测票据类型（单张）
     * @Author：John Goo
     * @Date：2024/11/28 9:35
     */
    public  JSONObject transferAndIdentifyType(String jsonStr) {
        JSONObject data = new JSONObject();
        JSONArray retArray = new JSONArray();
        data.put("ocrRet", retArray);
        // 类型
        data.put("type", "未知");
        data.put("typeDesc","--");

        // 票据特征描述
        /** ************* jsonStr解析处理 *******/
        JSONObject ocrData = JSON.parseObject(jsonStr);
        // 解析文本原始数组
        String arrayStr = ocrData.getString("ocrRet");
        JSONArray outArray = JSONArray.parseArray(arrayStr);
        if (outArray.size() > 0) {
            JSONArray array = outArray.getJSONArray(0);
            // 票据行业
            int total = array.size();
            // 分割，重新组合及合并

                for (int i = 0; i < array.size(); i++) {
                    JSONArray rowJson = array.getJSONArray(i);
                    //  array.getJSONArray(i).getJSONArray(1).get(0)
                    JSONObject row = new JSONObject();
                    String text = (String) rowJson.getJSONArray(1).get(0);
                    // 特殊字符转换
                    text = OcrTextParseUtil.chiSpecialStrTransferEn(text);
                    row.put("idx_" + (i + 1), (i + 1));
                    row.put("points", rowJson.getJSONArray(0));
                    row.put("text", text);
                    retArray.add(row);
                    // 识别特征
                    if(!isIdentifyType) {
                        String type = findCharacter(text,i,array);
                        data.put("type", type);
                        data.put("typeDesc",InvoiceTypeEnum.getTypeDesc(type));
                    }
                }

        }
        // 返回原数据
        return data;
    }



}
